組合語言轉換為機器語言的過程:
foo.s for RISC-V),這些程式碼可能包含偽指令(pseudoinstructions)。偽指令是一種高層次指令,最終會被轉換成具體的機器指令。foo.o for RISC-V)。這個物件文件包含機器碼,並且還包含一些連結和除錯所需的資訊,例如符號表(Symbol Table)、重定位資訊(Relocation Information)、數據段(Data Segment)等。Directives 指令的作用:
.text:告訴組譯器接下來的項目屬於程式的文字段(text segment),也就是放置機器碼的區域。.data:用來標示接下來的項目屬於資料段(data segment),這些數據會以二進制形式存儲在 object file 中。.globl sym:將符號 sym 宣告為全域變數,可以從其他文件中被引用。.string str:將字串 str 存入記憶體,並在字串末尾加上空字元以便終止。.word w1 ... wn:將 n 個 32 位元數量依次存入記憶體。Object File 格式:
Object file 是程式最終執行前的中間文件,包含不同的部分來支持連結和執行:
生成機器碼的過程:
add x18, x18, x10 和 addi x19, x19, -1,這些指令的操作數和結果都可以直接從指令本身中解讀出來。beq、bne 和 jal 等指令需要計算跳轉到標籤的位移(offset)。在這些情況下,指令中的位移是相對於當前程式計數器(PC)的。當 pseudoinstructions 被替換為實際指令後,所有基於 PC 的位址計算都能被執行。PC-Relative 地址計算的雙遍法:
處理其他引用:
strlen 函數,這需要知道 strlen 函數的地址。la 會被分解成 lui 和 addi,這些需要完整的 32 位地址。完整的 Object File 結構: